vlwkaos' digital garden

Raspberry Pi 3 B+ 서버 세팅 (2)

공개키 접속

인터넷은 친절한 곳이 아니기 때문에 더 안전한 접속방법을 설정할 필요가 있다. 윈도우에서는 C:Users\USERNAME\.ssh 경로에 키가 저장된다. 해당 폴더를 확인해보고 키나 폴더가 없다면 폴더부터 만들어 준다.

윈도우의 powershell에서 ssh-keygen 을 입력하면 공개키와 개인키쌍을 만들 수 있는데 위에서 언급한 폴더에 넣어준다. 파일 이름은 기본값으로 둔다. 확장자 .pub 이 공개키 파일이다.

키를 만들었으면 공개키를 호스트에게 전달해야 한다. 우리는 접속하려는 호스트가 라즈베리파이이다. 파이의 홈 디렉토리에 touch ~/.ssh/authorized_keys 커맨드로 파일을 새로 만들어서 공개키 파일의 내용물을 복사 붙여넣기 한다. 아니면 파일을 옮겨서 이름을 바꿔도 좋다.

이제 파이가 공개키 접속을 사용하도록 ssh 설정을 바꿔야 한다. /etc/ssh/sshd.conf 파일을 편집기로 열고 아래 처럼 바꾼다:

PermitRootLogin no 
PubKeyAuthentication yes 
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

위에서 부터 다음과 같다.

  • 원격접속시 루트계정 접근을 허용여부 no
  • 공개키 접속 사용여부 yes
  • 공개키 경로 ...
  • 패스워드 사용 no

설정했으면 저장한 뒤 sudo service ssh reload 를 입력하여 ssh를 재시작한다.

추가로 여기를 클릭하여 기타 보안관련 설정을 더 알아보는게 좋다.

DDNS 설정

일반 인터넷 사용자의 경우 고정 IP를 할당받지 못하기 때문에 외부에서 접속하려는 경우 이를 해결해줄 방법이 필요하다. 이때 DDNS(Dynamic Domian Name Server) 를 이용하면 된다. DDNS는 간단히 말해 하나의 도메인을 바뀌는 IP와 연결해주는 서비스이다. 여기서는 무료로 제공되는 duckdns.org를 이용할 것이다. 기부로 운영되고 있는 듯 하다. 고맙다면 기부를 해주자.

사이트에 들어가면 우측 상단에 여러 로그인 방법이 있으니 원하는 방법으로 로그인한다. 로그인을 하고 나면 duckdns.org을 이용한 서브 도메인을 등록하는 란이 보일 것이다. 원하는 이름을 적고 추가하면 된다. 이제 IP가 바뀔 때마다 방금 등록한 도메인으로 연결해줄 방법이 필요하다.

상단의 Install 탭을 클릭하자. 그럼 여러 시스템상에서 duckdns를 이용하는 방법이 뜨는데 우리는 라즈베리파이를 쓸 것이기 때문에 pi 버튼을 클릭한다. 그럼 먼저 도메인을 선택하라고 한다. 아까 등록했던 도메인을 선택하면 자동으로 어떤 커맨드를 입력할지 친절히 알려준다. 대략 설명하자면:

  1. 파이의 터미널에 접속한다. (ssh)
  2. 홈에 duckdns 폴더를 만들고 이동한다. 안에 쉘 스크립트 파일을 하나 만들고,
  3. 알려주는 커맨드를 복사 & 붙여넣기 한다.
  4. 스크립트 실행 권한을 설정한다.
  5. cron 으로 자동 실행을 설정한다.
  6. 스크립트를 직접 실행하여 잘 되는지 확인한다.

cron이 뭔지는 구글에 검색하면 자세히 나오니 따로 설명하지 않을 것이다.

파이 IP 고정

시작하기 전에 포트포워딩을 해야 하는데 포트포워딩을 하려면 기기의 IP를 고정해야한다. 한국 통신사가 대여해주는 몇몇 공유기는 이상하게 별 이유없이 안되는 경우가 많다는 점을 알고 시작하자. 파이의 IP를 고정하려면 편집기로 설정 파일 /etc/dhcpcd.conf을 열고 다음을 추가하면 된다. 아래는 참고로 파이를 무선랜으로 연결할 경우의 설정이다.

interface wlan0
static ip_address=192.168.xxx.yyy
static routers=192.168.xxx.1    
static domain_name_servers=1.1.1.1

위에서 부터 IP는 다음과 같다:

  • 고정 할당 할 로컬IP 주소 (라즈베리 파이의 내부 주소)
  • 공유기 IP 주소
  • DNS 주소

저장 후 라즈베리파이를 재부팅하면 고정IP로 잡힌다. 공유기 설정 페이지에서도 확인이 가능하다.

외부에서 ssh 접속

ssh 외부접속을 위해선 포트를 열어야한다. 관련 설정 파일은 다음 경로에 있다 /etc/ssh/sshd_config. 편집기로 열고 # port 22 가 있는 행을 찾는다. 코멘트 # 를 삭제하면 되는데, 보안을 위해서 포트번호를 22 이외의 다른 숫자로 바꿔 주는게 좋다. (공격자가 브루트포싱을 할 때 22, 222 ,2222 이런 순으로 하는 경우가 많다고 하니 되도록이면 랜덤하게 바꾸는 것을 추천한다.)

추가적으로 /etc/services 파일을 열고 ssh 항목을 찾아 적혀있는 포트번호를 위와 같은 번호로 수정해야 한다.

이제 공유기 설정으로 들어가서 포트포워딩을 해줘야 한다. 포트 포워딩은 내가 갖고있는 공인 IP로 외부에서 요청이 왔을 때 내부에 연결된 기기중 어디로(내부 IP) 접속 시킬 것인지 결정하는 기능이다. 포트포워딩을 하는 방법은 공유기마다 조금씩 다르지만 대략 다음과 같다:

  1. 외부 포트를 입력한다. (되도록 높은 숫자, e.g 12345)
  2. 내부 IP 주소와 내부 포트를 입력한다. (파이의 고정IP 주소, 위에서 변경한 SSH 포트)

즉, 나중에 외부에서 접속할 때 공유기의 포트포워딩 설정이 내가 설정한 내부 IP와 위에서 수정한 ssh 포트로 안내해주는 것이다.

설정을 마쳤으면 여기를 클릭해서 포트가 열려있는지 확인할 수 있다.

참고로 같은 네트워크 상에서 외부 아이피로 접속을 하려고 하면 Connection Refused 가 뜬다. 때문에 외부 망에서 확인해야 한다. 간단히 스마트폰 데이터를 킨 후 위의 사이트에서 DDNS주소를 입력하거나 현재 내 공유기 외부IP를 입력해서 확인할 수 있다.

아마 여기까지 잘 따라왔다면 ssh username@ddns_address.org -p 12345 와 같은 커맨드로 외부에서 접속이 가능할 것이다. DDNS 주소는 그대로 사용하기 보다 나중에 도메인을 구매해서 그걸 사용하자.

추가적으로 접속이 잘 안될때는 SSH 커맨드에 -vvv 옵션을 붙이면 어디서 연걸이 막히는지 확인이 가능하다.

Referred in

Raspberry Pi 3 B+ 서버 세팅 (2)